﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using QldtSdh.DAL.Models;

namespace QldtSdh.BLL
{
    partial class BizPhanCongGiangDay
    {
        /// <summary>
        /// Lấy danh sách giảng viên giảng dạy lớp học phần
        /// </summary>
        /// <param name="maLopHocPhan"></param>
        /// <returns></returns>
        public static List<GiangVien> GetList(string maLopHocPhan)
        {
            using (var db = CEMS4UG_DHKHContext.GetContext())
            {
                var lsMaGV = db.LopHocPhan_PhanCongGiangDayDbSet.Where(e => e.MaLopHocPhanGUID == maLopHocPhan).Select(e => e.MaGiangVien).ToList();
                if (lsMaGV.Count > 0)
                {
                    var listGV = db.GiangVienDbSet.Where(e => lsMaGV.Contains(e.MaGiangVien)).ToList();
                    return listGV;
                }
                return null;
            }
        }

        /// <summary>
        /// Danh sách giảng viên giảng dạy trong LHP "maLopHocPhan"
        /// Chứa thông tin chi tiết của GiangVien
        /// </summary>
        /// <param name="maLopHocPhan"></param>
        /// <param name="db"></param>
        /// <returns></returns>
        public static List<LopHocPhan_PhanCongGiangDay> GetListGiangVienGiangDay(string maLopHocPhan, CEMS4UG_DHKHContext db = null)
        {
            if (db == null)
                using (var db2 = CEMS4UG_DHKHContext.GetContext()) { return GetListGiangVienGiangDay(maLopHocPhan, db2); }
            else
            {
                var lstGiangVien = db.LopHocPhan_PhanCongGiangDayDbSet
                    .Include("GiangVien")
                    .Where(e => e.MaLopHocPhanGUID == maLopHocPhan)
                    .OrderBy(e => e.GiangVien.Ten)
                    .ToList();
                return lstGiangVien;
            }
        }


        /// <summary>
        /// Bổ sung thông tin phân công giảng dạy
        /// </summary>
        /// <param name="maLopHocPhan"></param>
        /// <param name="maGiangVien"></param>
        /// <param name="soGio"></param>
        /// <param name="db"></param>
        public static void Insert(string maLopHocPhan, string maGiangVien, int soGio, CEMS4UG_DHKHContext db = null)
        {
            if (db == null)
                using (var db2 = CEMS4UG_DHKHContext.GetContext()) { Insert(maLopHocPhan, maGiangVien, soGio, db2); }
            else
            {
                if (db.LopHocPhan_PhanCongGiangDayDbSet.Count(e => e.MaLopHocPhanGUID == maLopHocPhan && e.MaGiangVien == maGiangVien) > 0)
                    throw new Exception("Đã phân công giảng viên tham gia giảng dạy lớp học phần");
                var x = new LopHocPhan_PhanCongGiangDay()
                {
                    MaLopHocPhanGUID = maLopHocPhan,
                    MaGiangVien = maGiangVien,
                    TongSoGio = soGio
                };
                db.LopHocPhan_PhanCongGiangDayDbSet.Add(x);
                BizNhatKyHoatDong.LogAndCommitInsert<LopHocPhan_PhanCongGiangDay>(x, x.MaPhanCongGiangDayGUID, LOAIDOITUONG.PHÂN_CÔNG_GIẢNG_DẠY, db);
            }
        }

        public static void Delete(LopHocPhan_PhanCongGiangDay x, CEMS4UG_DHKHContext db = null)
        {
            if (db == null)
                using (var db2 = CEMS4UG_DHKHContext.GetContext()) { Delete(x, db2); }
            else
            {
                var oX = db.LopHocPhan_PhanCongGiangDayDbSet.Where(e => e.MaGiangVien == x.MaGiangVien && e.MaLopHocPhanGUID == x.MaLopHocPhanGUID).FirstOrDefault();
                if (oX == null)
                    throw new Exception("Thông tin phân công giảng dạy không còn tồn tại trên hệ thống");
                var nThoiKhoaBieu = db.LopHocPhan_ThoiKhoaBieuDbSet.Count(e => 
                    e.MaGiangVien == oX.MaGiangVien &&
                    e.MaLopHocPhanGUID == oX.MaLopHocPhanGUID);
                if (nThoiKhoaBieu > 0)
                    throw new Exception("Chưa xoá hệ các mục thời khoá biểu của giảng viên trước khi xoá thông tin phân công giảng dạy");
                db.LopHocPhan_PhanCongGiangDayDbSet.Remove(oX);
                BizNhatKyHoatDong.LogAndCommitDelete(oX, oX.MaPhanCongGiangDayGUID, LOAIDOITUONG.PHÂN_CÔNG_GIẢNG_DẠY, db);
            }
        }

        public static void Update(string maGiangVien, string maLopHocPhanGUID, int soGio, CEMS4UG_DHKHContext db = null)
        {
            if (db == null)
                using (var db2 = CEMS4UG_DHKHContext.GetContext()) { Update(maGiangVien, maLopHocPhanGUID, soGio, db2); }
            else
            {
                var oX = db.LopHocPhan_PhanCongGiangDayDbSet.Where(e => e.MaGiangVien == maGiangVien && e.MaLopHocPhanGUID == maLopHocPhanGUID).FirstOrDefault();
                if (oX == null)
                    throw new Exception("Thông tin phân công giảng dạy không còn tồn tại trên hệ thống");
                var duLieuCu = new LopHocPhan_PhanCongGiangDay() { MaGiangVien = maGiangVien, MaLopHocPhanGUID = maLopHocPhanGUID, TongSoGio = oX.TongSoGio };
                oX.TongSoGio = soGio;
                BizNhatKyHoatDong.LogAndCommitUpdate<LopHocPhan_PhanCongGiangDay>(duLieuCu, oX, oX.MaPhanCongGiangDayGUID, LOAIDOITUONG.PHÂN_CÔNG_GIẢNG_DẠY, db);
            }
        }
    }
}
